package com.sokobanboxpro.game.managers;

import com.sokobanboxpro.game.exception.ConfigValueNotFoundException;
import com.sokobanboxpro.game.system.Config;
import java.io.*;
import java.util.ArrayList;
import org.newdawn.slick.util.Log;

/**
 * Менеджер сохранения состояния приложения.
 *
 * @author Esr
 */
public class SaveGameStateManager {

		/**
		 * Количество пройденных уровней.
		 */
		private static int levelsComplite;
		/**
		 * Количество использованных пропусков.
		 */
		private static int skips;
		/**
		 * Выходной поток.
		 */
		private static OutputStreamWriter outStream;
		/**
		 * Имя файла сохранения.
		 */
		private static String saveFileName;
		/**
		 * Входной поток.
		 */
		private static FileReader fileReader;
		/**
		 * Номера пропушенных уровней.
		 */
		private static ArrayList<Integer> skipsLevel = new ArrayList<Integer>();

		/**
		 * Инициализация.
		 *
		 * @throws ConfigValueNotFoundException
		 */
		public static void init() throws ConfigValueNotFoundException {

				saveFileName = Config.toStr("SaveFileName");
				try {
						File file = new File(saveFileName);
						if (!file.exists()) {
								outStream = new OutputStreamWriter(new FileOutputStream(saveFileName), "ISO-8859-1");
								outStream.close();
						}
				} catch (Exception ex) {
						Log.error("Не вохможно создать новый файл сохранения" + ex);
						ex.printStackTrace();
				}


		}

		/**
		 * Загрузить сохраненное состояние.
		 *
		 * @throws IOException
		 */
		public static void loadState() throws IOException {

				fileReader = new FileReader(saveFileName);
				BufferedReader reader = new BufferedReader(fileReader);
				levelsComplite = reader.read();
				skips = reader.read();
				if (levelsComplite == -1 || skips == -1) {
						levelsComplite = 1;
						skips = 5;
						saveState();
				} else {
						int level;
						while ((level = reader.read()) != -1) {
								skipsLevel.add(level);
						}

				}
				reader.close();


		}

		/**
		 * Сохранить текушее состояние.
		 *
		 * @throws UnsupportedEncodingException
		 * @throws FileNotFoundException
		 */
		public static void saveState() throws UnsupportedEncodingException, FileNotFoundException {

				outStream = new OutputStreamWriter(new FileOutputStream(saveFileName), "ISO-8859-1");
				PrintWriter file = new PrintWriter(outStream);
				file.write(levelsComplite);
				file.write(skips);
				for (Integer num : skipsLevel) {
						file.write(num);
				}
				file.close();

		}

		/**
		 * Получить количество пройденных уровней.
		 *
		 * @return Количество пройденных уровней
		 */
		public static int getLevelsComplite() {
				return levelsComplite;
		}

		/**
		 * Уставновить количество пройденных уровней.
		 *
		 * @param levelsComplite Количество пройденных уровней
		 */
		public static void setLevelsComplite(int levelsComplite) {
				SaveGameStateManager.levelsComplite = levelsComplite;
		}

		/**
		 * Получить количество пропусков.
		 *
		 * @return Количество пропусков
		 */
		public static int getSkips() {
				return skips;
		}

		/**
		 * Уставновить количество пропусков.
		 *
		 * @param skips Количество пропусков
		 */
		public static void setSkips(int skips) {
				SaveGameStateManager.skips = skips;
		}

		/**
		 * Получить список пропушенных уровней.
		 *
		 * @return Список пропушенных уровней
		 */
		public static ArrayList<Integer> getSkipsLevel() {
				return skipsLevel;
		}

		/**
		 * Уставновить список пропушенных уровней.
		 *
		 * @param aSkipsLevel Список пропушенных уровней
		 */
		public static void setSkipsLevel(ArrayList<Integer> aSkipsLevel) {
				skipsLevel = aSkipsLevel;
		}

}
